﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////



#pragma once

#include "GmFamilyService.h"
#include "NdbObjectSchematic.h"
#include "IParameterCustomData.h"


#define CUSTOM_DATA_LIST_ID   L"CustomDataListId"


namespace gcmp
{
    class GraphicsNodeId;


    /// \brief 自定义数据列表项接口类
    class GM_FAMILY_SERVICE_EXPORT ICustomDataListItem : public NdbObjectSchematic
    {
        DEFINE_CAST_DERIVED(gcmp::ICustomDataListItem, gcmp::NdbObjectSchematic);

    public:
        /// \brief 创建一个默认的自定义数据列表项对象
        /// \return OwnerPtr<ICustomDataListItem> 创建的对象
        static OwnerPtr<ICustomDataListItem> Create();

        /// \brief 获取名称
        /// \return std::wstring 名称
        virtual const std::wstring& GetName() const = 0;

        /// \brief 设置名称
        /// \param std::wstring 名称
        /// \return void
        virtual void SetName(const std::wstring& name) = 0;

        /// \brief 获取图形节点Id
        /// \return Coordinate3d 连接件的坐标系
        virtual const GraphicsNodeId& GetGraphicsNodeId() const = 0;

        /// \brief 设置图形节点Id
        /// \param gNodeId 图形节点Id
        /// \return void
        virtual void SetGraphicsNodeId(const GraphicsNodeId& gNodeId) = 0;

        /// \brief 比较两个自定义数据列表项是否相等
        /// \param other 比较的对象
        /// \return bool 比较结果
        virtual bool HasSameValue(const ICustomDataListItem* pOther) const = 0;

        /// \brief 比较自身数据是否小于另一个数据项对象
        /// \param other 比较的对象
        /// \return bool 比较结果
        virtual bool IsLessThan(const ICustomDataListItem* pOther) const = 0;

        /// \brief 比较两个自定义数据列表项是否相等
        /// \param other 比较的对象
        /// \return bool 比较结果
        virtual bool operator==(const ICustomDataListItem& other) const = 0;

        /// \brief 比较自身数据是否小于另一个数据项对象
        /// \param other 比较的对象
        /// \return bool 比较结果
        virtual bool operator<(const ICustomDataListItem& other) const = 0;

        /// \return OwnerPtr<ICustomDataListItem>克隆的对象
        virtual OwnerPtr<ICustomDataListItem> Clone() const = 0;
    };


    /// \brief 自定义数据列表接口类，保存文档中自定义数据列表信息
    class GM_FAMILY_SERVICE_EXPORT ICustomDataList : public IParameterCustomData
    {
        DEFINE_CAST_DERIVED(gcmp::ICustomDataList, gcmp::IParameterCustomData);

    public:
        /// \brief 创建自定义数据列表
        /// \param datas 各个自定义数据列表项的集合
        /// \return 自定义数据列表
        static OwnerPtr<ICustomDataList> Create(std::vector<OwnerPtr<ICustomDataListItem>>&& datas);

        /// \brief 获取自定义数据列表项的集合
        /// \return  自定义数据列表项的集合
        virtual std::vector<OwnerPtr<ICustomDataListItem>>& GetDatas() = 0;

        /// \brief 获取自定义数据列表项的集合
        /// \return  自定义数据列表项的集合
        virtual const std::vector<OwnerPtr<ICustomDataListItem>>& GetDatas() const = 0;

        /// \brief 设置自定义数据列表项的集合
        /// \param datas 自定义数据列表项的集合
        /// \return bool 成功返回true，失败返回false
        virtual bool SetDatas(std::vector<OwnerPtr<ICustomDataListItem>>&& datas) = 0;

        /// \brief 添加自定义数据列表项
        /// \param data 自定义数据列表项
        /// \return bool 成功返回true，失败返回false
        virtual bool AddData(OwnerPtr<ICustomDataListItem> data) = 0;
    };
}
